package com.example.administrator.exkotlin.jetpack.viewmodel

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProviders
import com.example.administrator.exkotlin.R
import com.example.administrator.exkotlin.activity.BaseActivity
import com.example.administrator.exkotlin.endurance.MySharedPreferences
import com.example.administrator.exkotlin.endurance.read
import com.example.administrator.exkotlin.endurance.save
import com.example.administrator.exkotlin.jetpack.lifecycle.MyObserver
import kotlinx.android.synthetic.main.activity_view_model.*

class ViewModelActivity : BaseActivity() {
    private val TAG = "ViewModelActivity"
    lateinit var vm: JetPackViewModel
    private val text = StringBuilder()
    private var count = 0

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_view_model)
        //使用viewModel
        val countHistory = MySharedPreferences.read("count", 0)
        //viewModel的创建必须由ViewModelProviders完成，否则会受到activity生命周期影响vm数据
        vm = ViewModelProviders.of(this, JetPackVMFactory(countHistory)).get(JetPackViewModel::class.java)
        lifecycle.addObserver(MyObserver(lifecycle))

        initData()
        ObserverCountData()
        ObserverData()
        ObserverAllData()

    }


    private fun initData() {
        btn_dd.setOnClickListener {
            vm.plusDataInMain()
        }
        btn_dd.setOnLongClickListener {
            vm.clearInMain()
            false
        }
    }

    private fun ObserverCountData() {
        //这里没有使用lambda表达式是因为规定两个单抽象方法接口参数，要么同时都使用lambda表达式，要么都不适用
        //因此第一个LifeOwner参数使用this，者第二个Observer不能使用lambda
        //通过livedata数据的监听，可以不用考虑生命周期，因为已经传入了LifeOwner，自动管理生命周期
        vm.count.observe(this, Observer { data ->
            text.append(data.toString() + "\r\n")
            tv_count.text = text.toString()
//            Log.i(TAG, data.toString())
        })


    }

    private fun ObserverData() {
        //这里没有使用lambda表达式是因为规定两个单抽象方法接口参数，要么同时都使用lambda表达式，要么都不适用
        //因此第一个LifeOwner参数使用this，者第二个Observer不能使用lambda
        //通过livedata数据的监听，可以不用考虑生命周期，因为已经传入了LifeOwner，自动管理生命周期
        //但被观察的对象调用setValue或者postValue时候才会通知
        vm.observeDat.observe(this, Observer { data ->
            text.append(data.toString() + "\r\n")
            tv_count.text = text.toString()
//            Log.i(TAG, data.toString())
        })
    }

    private fun ObserverAllData() {
        //这里没有使用lambda表达式是因为规定两个单抽象方法接口参数，要么同时都使用lambda表达式，要么都不适用
        //因此第一个LifeOwner参数使用this，者第二个Observer不能使用lambda
        //通过livedata数据的监听，可以不用考虑生命周期，因为已经传入了LifeOwner，自动管理生命周期
        vm.getViewData(str = "测试", cout = 5).observe(this, Observer { data ->
            text.append(data.toString() + "\r\n")
            tv_count.text = text.toString()
//            Log.i(TAG, data.toString())
        })


    }


    override fun onDestroy() {
        super.onDestroy()
        MySharedPreferences.save {
            putInt("count", vm.count.value ?: 0)
        }
    }
}
